package com.new1cloud.file.domain;

import com.new1cloud.file.upload.client.entry.ChunkFile;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 文件切分之后的分片信息
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FileChunkInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 文件的绝对路径
     */
    private String filePath;

    /**
     * 文件唯一标识码
     */
    private String fileHash;

    /**
     * 分片文件列表
     */
    private List<ChunkFile> chunkFiles;

    /**
     * 对FileChunkInfo的chunkFiles进行切分
     * @param batchSize 每个子集的最大元素个数
     * @return 切分出的子集FileChunkInfos
     */
    public static List<FileChunkInfo> splitByChunkFiles(FileChunkInfo parentFileChunkInfo, Integer batchSize) {
        if(CollectionUtils.isEmpty(parentFileChunkInfo.getChunkFiles())) {
            return Collections.emptyList();
        }
        List<ChunkFile> chunkFiles = parentFileChunkInfo.getChunkFiles();
        int limit = (chunkFiles.size() + batchSize - 1) / batchSize;
        //分成limit次发请求到数据库，in（）操作时   可以把多条数据分割成多组请求
        return Stream.iterate(0, n -> n + 1)
                .limit(limit)
                .map(a -> {
                    List<ChunkFile> subChunkFiles = chunkFiles.stream()
                            .skip((long) a * batchSize)
                            .limit(batchSize)
                            .collect(Collectors.toList());
                    return FileChunkInfo.builder().filePath(parentFileChunkInfo.getFilePath())
                            .fileHash(parentFileChunkInfo.getFileHash())
                            .chunkFiles(subChunkFiles)
                            .build();
                })
                .collect(Collectors.toList());
    }
}